package com.dynamic.model.service.impl;

import java.util.ArrayList;
import java.util.List;

import javax.annotation.Resource;

import com.dynamic.model.common.dao.BaseDao;
import com.dynamic.model.common.vo.Page;
import com.dynamic.model.dao.SystemResourceDao;
import com.dynamic.model.dao.SystemRoleDao;
import com.dynamic.model.model.po.SysmanResource;
import com.dynamic.model.model.po.SysmanRole;
import com.dynamic.model.model.po.SysmanUser;
import com.dynamic.model.service.SystemResourceService;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.subject.Subject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.dynamic.model.common.service.impl.BaseServiceImpl;

/**
 * 
 * @desc 用户后台资源资源权限表--RBAC权限管理service接口实现类
 *
 * @author luwei
 * @Fri Aug 08 13:29:41 CST 2014
 */
@Service
public class SystemResourceServiceImpl extends BaseServiceImpl<SysmanResource> implements SystemResourceService {

	@Autowired
	SystemRoleDao roledao;
	@Override
	@Resource(name ="systemResourceDaoImpl")
	public void setBaseDao(BaseDao<SysmanResource> dao) {
		this.baseDao =  dao;
	}
	
	private SystemResourceDao getDao(){
		return (SystemResourceDao) this.baseDao ;
	}

	@Override
	public List<SysmanResource> getRootResourceList() {
		return this.getDao().getRootResourceList();
	}

	/**
	 * update操作，移动错误时抛出异常信息
	 * @param entity
	 * @param parentId
	 */
	private void checkErrorMove(SysmanResource entity, Integer parentId) {
		if(entity.getParent().getPid() == null) {
			throw new RuntimeException("顶级菜单不允许操作");
		} else {
			if( entity.getPid() == parentId ){
				throw new RuntimeException("父级知识点不能是自己！");
			}else{
				if(entity != null && entity.getSubResource() != null){
					for(SysmanResource kk : entity.getSubResource()){
						
						if( parentId == kk.getPid() ){
							throw new RuntimeException("父级知识点不能是自己的子知识点！");
						}else{
							checkErrorMove(kk,parentId);
						}
					}
				}
			}
		}
	}

	@Override
	public List<SysmanResource> getPageDataByName(Page<SysmanResource> page, String name, String type) {
		return this.getDao().getPageDataReqName(page,name,type);
	}

//	@Override
//	public void save(SysmanResource entity) throws Exception {
//		this.getBaseDao().save(entity);
//		SysmanRole supprole;
//		SysmanRole sysrole;
//		switch (entity.getMenuType()) {
//		case 0:
//			supprole=this.roledao.get(0);
//			List<SysmanResource> suppmenus=supprole.getResource();
//			suppmenus.add(entity);
//			supprole.setResource(suppmenus);
//			this.roledao.update(supprole);
//			break;
//		case 1:
//			sysrole=this.roledao.get(1);
//			List<SysmanResource> sysmenus=sysrole.getResource();
//			sysmenus.add(entity);
//			sysrole.setResource(sysmenus);
//			this.roledao.update(sysrole);
//			break;
//		case 2:
//			supprole=this.roledao.get(0);
//			sysrole=this.roledao.get(1);
//			List<SysmanResource> suppmuenutemp=supprole.getResource();
//			List<SysmanResource> sysmuenutemp=sysrole.getResource();
//			suppmuenutemp.add(entity);
//			sysmuenutemp.add(entity);
//			supprole.setResource(suppmuenutemp);
//			sysrole.setResource(sysmuenutemp);
//			this.roledao.update(supprole);
//			this.roledao.update(sysrole);
//			break;
//		default:
//			throw new Exception("菜单类型错误");
//		}
//	}
	
//	@Override
//	public void update(SysmanResource entity) throws Exception {
//		this.getBaseDao().update(entity);
//		SysmanRole supprole;
//		SysmanRole sysrole;
//		switch (entity.getMenuType()) {
//		case 0:
//			supprole=this.roledao.get(0);
//			List<SysmanResource> suppmenus=supprole.getResource();
//			suppmenus.add(entity);
//			supprole.setResource(suppmenus);
//			this.roledao.update(supprole);
//			break;
//		case 1:
//			sysrole=this.roledao.get(1);
//			List<SysmanResource> sysmenus=sysrole.getResource();
//			sysmenus.add(entity);
//			sysrole.setResource(sysmenus);
//			this.roledao.update(sysrole);
//			break;
//		case 2:
//			supprole=this.roledao.get(0);
//			sysrole=this.roledao.get(1);
//			List<SysmanResource> suppmuenutemp=supprole.getResource();
//			List<SysmanResource> sysmuenutemp=sysrole.getResource();
//			suppmuenutemp.add(entity);
//			sysmuenutemp.add(entity);
//			supprole.setResource(suppmuenutemp);
//			sysrole.setResource(sysmuenutemp);
//			this.roledao.update(supprole);
//			this.roledao.update(sysrole);
//			break;
//		default:
//			throw new Exception("菜单类型错误");
//		}
//	}
	
	@Override
	public List<SysmanResource> getHasResourceList() {
		Subject subject = SecurityUtils.getSubject();
		SysmanUser user = (SysmanUser) subject.getPrincipal();
		if(user.getUserType()==1){
			List<SysmanResource> resources=new ArrayList<SysmanResource>();
			List<SysmanRole> roles= user.getRoles();
			for(SysmanRole role:roles){
				resources.addAll(role.getResource());
			}
			return resources;
		}else{
			return this.getDao().getAll();
		}

	}

}
